package com.code.common.utils;


import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.io.UnsupportedEncodingException;
import java.util.Date;

/**
 *  JWT 工具
 * */
public class JWTUtil {

    // 过期时间 24 小时 24 * 60 * 60 * 1000     --30 分钟 1000L * 60 * 20
    private static final long EXPIRE_TIME = 30 * 60 * 1000L;
    // 密钥  ZWLPHOukc8BDbRigUDaY6pZFfWus2j
    private static final String SECRET = "SHIRO+JWT";


    /**
     * 生成 jwt token，并指定默认过期时间 30 分钟
     */
    public static String getJwtToken(String username) {
        return createToken(username, EXPIRE_TIME);
    }

    /**
     * 生成 token, 24h后过期
     *
     * @param username 用户名
     * @return 加密的token
     */
    public static String createToken(String username,Long expire) {
        try {
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            Algorithm algorithm = Algorithm.HMAC256(SECRET);
            // 附带username信息
            return JWT.create()
                    .withClaim("username", username)
                    .withClaim("withexpiresAt", date)
                    // 设置 jwt 发布时间
                    .withIssuedAt(new Date())
                    //到期时间
                    .withExpiresAt(date)
                    //创建一个新的JWT，并使用给定的算法进行标记
                    .sign(algorithm);
        } catch (UnsupportedEncodingException e) {
            return null;
        }
    }



    public static Date getDateByToken(String token) {
        try {
            return JWT.decode(token).getExpiresAt();
        }catch (Exception e){
            //log.debug("validate is token error ", e);
            return null;
        }
    }



    /**
     * 校验 token 是否正确
     *
     * @param token    密钥
     * @param username 用户名
     * @return 是否正确
     */
    public static boolean verify(String token, String username) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(SECRET);
            //在token中附带了username信息
            JWTVerifier verifier = JWT.require(algorithm)
                    .withClaim("username", username)
                    .build();
            //验证 token
            verifier.verify(token);
            return true;
        } catch (Exception exception) {
            return false;
        }
    }

    /**
     * 获得token中的信息，无需secret解密也能获得
     * @return token中包含的用户名
     */
    public static String getUsername(String token) {
        try {
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getClaim("username").asString();
        } catch (JWTDecodeException e) {
            return null;
        }
    }


    /**
     * 获取token中的到期时间
     * */
    public static Date getjwtExpiration(String token) {
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getClaim("withexpiresAt").asDate();
    }


    /**
     * token是否过期
     * @return  true：过期
     */
    public static boolean isTokenExpired(Date expiration) {
        return expiration.before(new Date());
    }







}
